package xyz.fivefaith.tool.common.util;

import io.github.linpeilie.Converter;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * mapstruct-plus
 *
 * @author zhaoanchi
 * @version 1.0
 * @since 1.0
 */
public class MapstructUtil {
    // 手动实例化 Converter，而非从 Spring 容器中获取
    private static final Converter CONVERTER = new Converter();

    /** 将 T 类型对象，转换为 desc 类型的对象并返回 */
    public static <T, V> V convert(T source, Class<V> desc) {
        if (ObjectUtils.isEmpty(source) || ObjectUtils.isEmpty(desc)) {
            return null;
        }
        return CONVERTER.convert(source, desc);
    }

    /** 将 T 类型对象，按照配置的映射字段规则，给 desc 类型的对象赋值并返回 desc 对象 */
    public static <T, V> V convert(T source, V desc) {
        if (ObjectUtils.isEmpty(source) || ObjectUtils.isEmpty(desc)) {
            return null;
        }
        return CONVERTER.convert(source, desc);
    }

    /** 将 T 类型的集合，转换为 desc 类型的集合并返回 */
    public static <T, V> List<V> convert(List<T> sourceList, Class<V> desc) {
        if (ObjectUtils.isEmpty(sourceList)) {
            return null;
        }
        if (CollectionUtils.isEmpty(sourceList)) {
            return new ArrayList<>();
        }
        return CONVERTER.convert(sourceList, desc);
    }
}
